/*
        数组串联
        给定一个数组，返回一个数组，该数组是给定数组大小的2倍，内容是给定数组的串联形式
        例如：
        已知数组：1 2 1
        返回数组：1 2 1 1 2 1

        夏思成

        2024年4月8日

        西科大15号公寓楼
*/

////法一：
//
//#include <stdio.h>
//#include <assert.h>
//#include <stdlib.h>
//
//int* getConcatenation(int* nums, int numsSize, int* returnSize)
//{
//    assert(nums && returnSize);
//
//    int* ans = (int*)malloc(sizeof(int) * (2 * numsSize));
//    if (ans == NULL)
//    {
//        perror("malloc");
//        return NULL;
//    }
//
//    int i = 0;
//    int j = 0;
//    for (i = 0; i < 2 * numsSize; i++)
//    {
//        ans[i] = nums[j++];
//        if (j == numsSize)
//        {
//            j = 0;
//        }
//    }
//
//    *returnSize = 2 * numsSize;
//    return ans;
//}


////法二：
//
//#include <stdio.h>
//#include <assert.h>
//#include <stdlib.h>
//int* getConcatenation(int* nums, int numsSize, int* returnSize)
//{
//    assert(nums && returnSize);
//
//    int* ans = (int*)malloc(sizeof(int) * (2 * numsSize));
//    if (ans == NULL)
//    {
//        perror("malloc");
//        return NULL;
//    }
//
//    int z = 0;
//    int i = 0;
//    for (i = 0; i < 2; i++)
//    {
//        int j = 0;
//        for (j = 0; j < numsSize; j++, z++)
//        {
//            ans[z] = nums[j];
//        }
//    }
//
//    *returnSize = 2 * numsSize;
//    return ans;
//}


////法三：
////使用realloc，放大已经申请的内存空间
//
//#include <stdio.h>
//#include <assert.h>
//#include <stdlib.h>
//
//int* getConcatenation(int* nums, int numsSize, int* returnSize)
//{
//    assert(nums && returnSize);
//
//    int* ans = (int*)malloc(sizeof(int) * numsSize);
//    if (ans == NULL)
//    {
//        perror("malloc");
//        return NULL;
//    }
//
//    int i = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        ans[i] = nums[i];
//    }
//
//    int* ret = (int*)realloc(ans, sizeof(int) * 2 * numsSize);
//
//    if (ret != NULL)
//    {
//        ans = ret;
//    }
//
//    for (i = 0; i < numsSize; i++)
//    {
//        ans[numsSize + i] = nums[i];
//    }
//
//    *returnSize = 2 * numsSize;
//    return ans;
//}


////法四：
////利用内存操作函数memcpy，实现内存的复制
//
//#include <stdio.h>
//#include <assert.h>
//#include <stdlib.h>
//#include <string.h>
//
//int* getConcatenation(int* nums, int numsSize, int* returnSize)
//{
//    assert(nums && returnSize);
//
//    int* ans = (int*)malloc(sizeof(int) * 2 * numsSize);
//    if (ans == NULL)
//    {
//        perror("malloc");
//        return NULL;
//    }
//
//    memcpy(ans, nums, sizeof(int) * numsSize);
//    memcpy(ans + numsSize, nums, sizeof(int) * numsSize);
//
//    *returnSize = 2 * numsSize;
//    return ans;
//}


//法五
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int* getConcatenation(int* nums, int numsSize, int* returnSize)
{
    assert(nums && returnSize);

    int* ans = (int*)malloc(sizeof(int) * 2 * numsSize);
    if (ans == NULL)
    {
        perror("malloc");
        return NULL;
    }

    int i = 0;
    for (i = 0; i < numsSize * 2; i++)
    {
        ans[i] = nums[i % numsSize];
    }

    *returnSize = 2 * numsSize;
    return ans;
}